package models

import (
	"driver_srv/basic/config"
	"gorm.io/gorm"
	"time"
)

// 车辆表
type Vehicle struct {
	Id                  uint32         `gorm:"column:id;type:int UNSIGNED;comment:车辆信息唯一标识;primaryKey;not null;" json:"id"`                                // 车辆信息唯一标识
	DriverId            int32          `gorm:"column:driver_id;type:int;comment:司机id;not null;" json:"driver_id"`                                          // 司机id
	VehicleFilesID      int32          `gorm:"column:vehicle_files_id;type:int;comment:车辆文件ID;not null;" json:"vehicle_files_id"`                          //车辆证件 ID
	CityId              int32          `gorm:"column:city_id;type:int;comment:归属城市ID;not null;" json:"city_id"`                                            // 归属城市ID
	LevelId             int32          `gorm:"column:level_id;type:int;comment:车辆级别ID;not null;" json:"level_id"`                                          // 车辆级别ID
	ModelId             int32          `gorm:"column:model_id;type:int;comment:车型ID;not null;" json:"model_id"`                                            // 车型ID
	VinCode             string         `gorm:"column:vin_code;type:varchar(50);comment:车辆VIN码;not null;" json:"vin_code"`                                  // 车辆VIN码
	LicensePlate        string         `gorm:"column:license_plate;type:varchar(50);comment:车牌号;not null;" json:"license_plate"`                           // 车牌号
	IsInstalledCarBrain int8           `gorm:"column:is_installed_car_brain;type:tinyint;comment:是否安装车脑（0：否，1：是）;not null;" json:"is_installed_car_brain"` // 是否安装车脑（0：否，1：是）
	CarBrainBrand       string         `gorm:"column:car_brain_brand;type:varchar(50);comment:车脑品牌;default:NULL;" json:"car_brain_brand"`                  // 车脑品牌
	CarBrainNumber      string         `gorm:"column:car_brain_number;type:varchar(50);comment:车脑编号;default:NULL;" json:"car_brain_number"`                // 车脑编号
	LargeScreenBrand    string         `gorm:"column:large_screen_brand;type:varchar(50);comment:大屏品牌;default:NULL;" json:"large_screen_brand"`            // 大屏品牌
	LargeScreenNumber   string         `gorm:"column:large_screen_number;type:varchar(50);comment:大屏编号;default:NULL;" json:"large_screen_number"`          // 大屏编号
	Status              int8           `gorm:"column:status;type:tinyint;comment:车辆状态 1:启用  2:停用;not null;" json:"status"`                                 // 车辆状态 1:启用  2:停用
	Bind                int64          `gorm:"column:bind;type:bigint;comment:车辆绑定:  1:绑定  2:解除;not null;" json:"bind"`                                    // 车辆绑定:  1:绑定  2:解除
	CreateAt            time.Time      `gorm:"column:create_at;type:datetime;comment:记录创建时间;not null;default:CURRENT_TIMESTAMP;" json:"create_at"`         // 记录创建时间
	UpdateAt            time.Time      `gorm:"column:update_at;type:datetime;comment:记录更新时间;not null;default:CURRENT_TIMESTAMP;" json:"update_at"`         // 记录更新时间
	DeletedAt           gorm.DeletedAt `gorm:"column:deleted_at;type:datetime;comment:删除时间;default:NULL;" json:"deleted_at"`                               // 删除时间
}

func (v *Vehicle) TableName() string {
	return "vehicle"
}

// 添加车辆
func (v *Vehicle) CreateVehicle() error {
	return config.DB.Create(&v).Error
}

// 根据车辆id查询车辆信息
func (v *Vehicle) GetVehicleById(vehicleId int64) error {
	return config.DB.Where("id = ?", vehicleId).Limit(1).Find(&v).Error
}

// 查找车辆信息（根据ID）
func (v *Vehicle) FindVehicleById() error {
	return config.DB.Where("id = ?", v.Id).First(v).Error
}

// 根据司机ID获取车辆信息
func (v *Vehicle) FindVehicleByDriverId() error {
	return config.DB.Where("id = ? AND deleted_at IS NULL", v.DriverId).First(v).Error
}

// 更新车辆信息
func (v *Vehicle) UpdateVehicle() error {
	return config.DB.Model(v).Where("id = ?", v.Id).Updates(v).Error
}

type ListVehicle struct {
	Id     int    `json:"id"`
	Status int8   `json:"status"`
	Bind   int64  `json:"bind"`
	Level  string `json:"level"`
	Model  string `json:"model"`
}

// 车辆展示
func (v *Vehicle) ListVehicle() (listVehicle []*ListVehicle, err error) {
	err = config.DB.Model(&Vehicle{}).
		Select("vehicle.id, vehicle.status, vehicle.bind, level.level as level, model.model as model").
		Joins("LEFT JOIN level ON vehicle.level_id = level.id").
		Joins("LEFT JOIN model ON vehicle.model_id = model.id").
		Find(&listVehicle).Error
	return listVehicle, err
}
